package com.example.service.impl;

import com.example.dao.QRCodeDao;
import com.example.entity.QRCode;
import com.example.service.QRCodeService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 二维码服务实现类
 */
@Service("qrCodeService")
public class QRCodeServiceImpl implements QRCodeService {

    @Resource
    private QRCodeDao qrCodeDao;
    
    @Value("${upload.base.dir}")
    private String uploadBaseDir;
    
    @Value("${upload.qrcode.dir}")
    private String qrcodeDir;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public QRCode queryById(Long id) {
        return this.qrCodeDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<QRCode> queryAllByLimit(int offset, int limit) {
        return this.qrCodeDao.queryAllByLimit(offset, limit);
    }

    /**
     * 查询所有二维码
     *
     * @param qrCode 筛选条件
     * @return 二维码列表
     */
    @Override
    public List<QRCode> queryAll(QRCode qrCode) {
        return this.qrCodeDao.queryAll(qrCode);
    }
    
    /**
     * 查询用户的二维码列表
     *
     * @param userId 用户ID
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<QRCode> queryByUserId(Long userId, int offset, int limit) {
        return this.qrCodeDao.queryByUserId(userId, offset, limit);
    }
    
    /**
     * 统计二维码总数
     * 
     * @return 二维码总数
     */
    @Override
    public Integer countQRCodes() {
        return this.qrCodeDao.countQRCodes();
    }
    
    /**
     * 统计用户的二维码总数
     * 
     * @param userId 用户ID
     * @return 二维码总数
     */
    @Override
    public Integer countUserQRCodes(Long userId) {
        return this.qrCodeDao.countUserQRCodes(userId);
    }

    /**
     * 新增数据
     *
     * @param qrCode 实例对象
     * @return 实例对象
     */
    @Override
    public QRCode insert(QRCode qrCode) {
        // 设置创建时间和更新时间
        Date now = new Date();
        qrCode.setCreateTime(now);
        qrCode.setUpdateTime(now);
        
        // 设置状态为正常
        if (qrCode.getStatus() == null) {
            qrCode.setStatus(1);
        }
        
        this.qrCodeDao.insert(qrCode);
        return qrCode;
    }

    /**
     * 修改数据
     *
     * @param qrCode 实例对象
     * @return 实例对象
     */
    @Override
    public QRCode update(QRCode qrCode) {
        // 设置更新时间
        qrCode.setUpdateTime(new Date());
        
        this.qrCodeDao.update(qrCode);
        return this.queryById(qrCode.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        // 先查询二维码信息
        QRCode qrCode = this.queryById(id);
        if (qrCode != null && qrCode.getImagePath() != null) {
            // 删除二维码图片文件
            try {
                File file = new File(qrCode.getImagePath());
                if (file.exists()) {
                    file.delete();
                }
            } catch (Exception e) {
                // 忽略文件删除异常
            }
        }
        
        return this.qrCodeDao.deleteById(id) > 0;
    }
    
    /**
     * 生成二维码图片
     *
     * @param content 二维码内容
     * @param width   宽度
     * @param height  高度
     * @return Base64编码的图片数据
     */
    @Override
    public String generateQRCodeImage(String content, int width, int height) {
        // 这里使用前端生成的二维码，后端只负责存储
        // 实际项目中可以使用ZXing等库在后端生成二维码
        return null;
    }
    

    /**
     * 通用文件上传方法
     * 
     * @param base64File Base64编码的文件数据
     * @param fileType 文件类型（例如："image", "document"等）
     * @param fileExtension 文件扩展名（例如：".png", ".pdf"等）
     * @return 上传文件的相对路径
     */
    public String uploadFile(String base64File, String fileType, String fileExtension) {
        if (base64File == null || base64File.isEmpty()) {
            return null;
        }
        return null;
        //
        //try {
        //    // 获取webapp的绝对路径
        //    //String webappPath = System.getProperty("catalina.base");
        //    //if (webappPath == null) {
        //        // 如果不在Tomcat环境中，使用当前工作目录
        //    String webappPath = System.getProperty("user.dir");
        //    //}
        //
        //    // 从配置文件获取上传目录
        //    String configuredFileType = fileType;
        //    // 如果是二维码类型，使用配置的二维码目录
        //    if ("qrcode".equals(fileType)) {
        //        configuredFileType = qrcodeDir;
        //    }
        //
        //    // 创建上传目录（确保路径存在）
        //    String uploadDir = webappPath + uploadBaseDir + "/" + configuredFileType + "/";
        //    Path uploadPath = Paths.get(uploadDir);
        //    if (!Files.exists(uploadPath)) {
        //        Files.createDirectories(uploadPath);
        //    }
        //
        //    // 生成文件名
        //    String fileName = UUID.randomUUID() + fileExtension;
        //    String filePath = uploadDir + fileName;
        //    String relativePath = uploadBaseDir + "/" + configuredFileType + "/" + fileName; // 用于返回的相对路径
        //
        //    // 解码Base64数据
        //    String base64Data = base64File;
        //    if (base64Data.contains(",")) {
        //        base64Data = base64Data.split(",")[1];
        //    }
        //    byte[] fileBytes = Base64.getDecoder().decode(base64Data);
        //
        //    // 保存文件
        //    try (FileOutputStream fos = new FileOutputStream(filePath)) {
        //        fos.write(fileBytes);
        //    }
        //
        //    return null; // 返回相对路径，便于前端访问
        //} catch (IOException e) {
        //    e.printStackTrace();
        //    return null;
        //}
    }
    /**
     * 保存二维码图片
     *
     * @param qrCode  二维码对象
     * @param base64Image Base64编码的图片数据
     * @return 图片保存路径
     */
    @Override
    public String saveQRCodeImage(QRCode qrCode, String base64Image) {
        if (base64Image == null || base64Image.isEmpty()) {
            return null;
        }
        
        // 使用通用上传方法上传图片，使用配置的二维码目录
        return uploadFile(base64Image, "qrcode", ".png");
    }
}